baselib.report(0x00, "TD4.5.2 beginning.")
-- 下面是初始化操作:
busilib.SetOrientation(1)             -- 设置USB的CC线,另一根则为Vconn线(这里设置CC1)
local VCC1 = 0
local VCC2 = 0

test1To3()                            -- 第一到三步
-- 第四步:If PUT is a PUT_C and Ra is attached to its Vconn pin:
-- 如果 PUT 是 PUT_C 并且 Ra 附加到其 Vconn 引脚:
--a. Complete steps 13 – 16.  b. Skip to step 7
VCC2 = busilib.GetADC(ADC.CC2, 4)
if PUT_C and VCC2 < 200 then
    goto Script13
end
-- 第五步:CVS transitions to Unattached.SNK after min dcSRC.DRP x min tDRP.
-- CVS 在 min dcSRC.DRP × min tDRP 后转换到 Unattached.SNK 状态
baselib.delay(15)                     -- 等待min dcSRC.DRP(0.3) x min tDRP(50ms)
busilib.setUsbCcs(CCS.Unattached)        
busilib.setUsbRole(ROLE.Sink)
-- 第六步:CVS verifies that PUT attaches Rp within max dcSRC.DRP x max tDRP [TD.4.5.2.V.2]
-- CVS 验证 PUT 在 max dcSRC.DRP × max tDRP 内附加 Rp
baselib.delay(70)                     -- 等待max dcSRC.DRP(0.7) x max tDRP(100ms)
VCC1 = busilib.GetADC(ADC.CC1, 4)
baselib.report(0x00, "CC1 is " .. VCC1 .. ".")
if VCC1 > 200 then
    baselib.report(0x00, "TD4.5.2.V.2 pass.")
else
    baselib.report(0x00, "TD4.5.2.V.2 fail.")
end
test7To9()                            -- 第七到九步
-- 第十步:对于PUT_C,测试结束
if PUT_C then
    goto ScriptEnd
end
-- 第十一步:CVS terminates one CC pin with Ra to look like an Emarked cable for the duration of the test.
-- CVS 将一个 CC 引脚设置为 Ra，模拟电子标记电缆
busilib.SetSwitchState(SW.CC2_RA, 1)       -- 将CC2_RA开关打开
-- 第十二步:重复1-3步
test1To3()

:: Script13 ::
-- 第十三步:CVS transitions to PoweredAccessory after max tCCDebounce
-- CVS 在 max tCCDebounce 后转换到 PoweredAccessory 状态
baselib.delay(200)
--busilib.setUsbCcs(CCS.PoweredAccessory)      现在应该没有 PoweredAccessory 状态
-- 第十四步:If PUT has VIF field Type_C_Is_Vconn_Powered_Accessory set to YES then the test is over
--如果 PUT 的 VIF 字段 Type_C_Is_Vconn_Powered_Accessory 设置为 YES，则测试结束
if Type_C_Is_Vconn_Powered_Accessory then
    goto ScriptEnd
end
-- 第十五步:CVS transitions to Try.SNK and starts tDRPTry
-- CVS 转换到 Try.SNK 状态并启动 tDRPTry
-- 现在有Try.SNK状态吗？
-- 第十六步:CVS verifies PUT attaches Rp within tPDDebounce min and tPDDebounce max + tDRPTransition [TD.4.5.2.V.7]
-- CVS 验证 PUT 在 tPDDebounce min 和 tPDDebounce max + tDRPTransition 内附加 Rp
baselib.delay(21)                     -- 等待tPDDebounce max(20ms) + tDRPTransition(1ms)  
VCC1 = busilib.GetADC(ADC.CC1, 4)
VCC2 = busilib.GetADC(ADC.CC2, 4)
baselib.report(0x00, "CC1 is " .. VCC1 .. "mV, and CC2 is " .. VCC2 .. "mV.")
if VCC1 > 200 and VCC2 > 200 then
    baselib.report(0x00, "TD4.5.2.V.7 pass.")
else
    baselib.report(0x00, "TD4.5.2.V.7 fail.")
end
-- 第十七步:重复7-9步
test7To9()

:: ScriptEnd ::
baselib.report(0x00, "Demo is done here.")
baselib.report(0x07, "\x04")

function test1To3()
    -- 第一步:CVS 转换到 Unattached.Accessory 状态
    -- TBD:现在还没有这个状态
    -- 第二步:CVS 等待 5ms
    baselib.delay(5)
    -- 第三步:CVS verifies that PUT attaches Rd within max dcSRC.DRP x max tDRP [TD.4.5.2.V.1]
    -- CVS 验证 PUT 在 max dcSRC.DRP × max tDRP 内附加 Rd
    baselib.delay(70)                     -- 等待max dcSRC.DRP x max tDRP  
    local tempVCC1 = busilib.GetADC(ADC.CC1, 4)
    baselib.report(0x00, "CC1 is " .. tempVCC1 .. "mV")
    if tempVCC1 < 200 then
        baselib.report(0x00, "TD4.5.2.V.1 pass.")
    else
        baselib.report(0x00, "TD4.5.2.V.1 fail.")
    end
end

function test7To9()
    -- 第七步:CVS verifies that PUT transitions to Attached.SRC after tCCDebounce:
    -- CVS 验证 PUT 在 tCCDebounce 后转换到 Attached.SRC 状态
    -- 第7.a步:PUT supplies VBUS within tVBUSON [TD.4.5.2.V.3]
    -- PUT 在 tVBUSON 内提供 VBUS
    baselib.delay(275)               -- tVBUSON:275ms
    if cstmlib.VBusVerified(1) then 
        baselib.report(0x00, "TD4.5.2.V.3 pass.")
    else
        baselib.report(0x00, "TD4.5.2.V.3 fail.")
    end
    -- 第7.b步:If PUT supports USB PD:VBUS reaches vSafe5V before initiating USB PD communications [TD.4.5.2.V.4] 
    -- 如果 PUT 支持 USB PD：VBUS 在启动 USB PD 通信之前达到 vSafe5V (暂定：最小值：4.75 V 标称值：5.00 V 最大值：5.25 V)
    if PUT_supports_PD then
        local VBus = busilib.GetADC(ADC.VBUS, 4)
        baselib.report(0x00, "VBus is " .. VBus .. "mV.")
        if VBus > 4750 and VBus < 5250 then 
            baselib.report(0x00, "TD4.5.2.V.4 pass.")
        else
            baselib.report(0x00, "TD4.5.2.V.4 fail.")
        end
    end
    -- 第八步:CVS 转换到 Disabled 状态
    busilib.setUsbCcs(CCS.Disabled)
    -- 第九步:CVS verifies that PUT transitions to Unattached.SNK within tSRCDisconnect.
    -- CVS 验证 PUT 在 tSRCDisconnect 内转换到 Unattached.SNK 状态
    -- 第9.a步:PUT removes VBUS within tVBUSOFF [TD.4.5.2.V.5]
    -- PUT 在 tVBUSOFF 内移除 VBUS
    baselib.delay(650)       -- 650（tVBUSOFF）
    VBus = busilib.GetADC(ADC.VBUS, 4)
    baselib.report(0x00, "VBus is " .. VBus .. "mV.")
    if VBus < 3670 then -- Spec P146?
        baselib.report(0x00, "TD4.5.2.V.5 pass.")
    else
        baselib.report(0x00, "TD4.5.2.V.5 fail.")
    end
    -- 第9.b步: PUT presents Rd terminations on its through CC pin [TD.4.5.2.V.6] For a PUT_R, verify both CC pins terminated to Rd
    -- PUT 在其直通 CC 引脚上提供 Rd 终端 [TD.4.5.2.V.6]：对于 PUT_R，验证两个 CC 引脚都为 Rd
    local tempVCC1 = busilib.GetADC(ADC.CC1, 4)
    local tempVCC2 = busilib.GetADC(ADC.CC2, 4)
    baselib.report(0x00, "CC1 is " .. tempVCC1 .. "mV, and CC2 is " .. tempVCC2 .. "mV.")
    if PUT_R then
        if tempVCC1 < 200 and tempVCC2 < 200 then
            baselib.report(0x00, "TD4.5.2.V.6 pass.")
        else
            baselib.report(0x00, "TD4.5.2.V.6 fail.")
        end
    else
        if tempVCC1 < 200 then
            baselib.report(0x00, "TD4.5.2.V.6 pass.")
        else
            baselib.report(0x00, "TD4.5.2.V.6 fail.")
        end
    end
end
